const axios = require('axios');

/**
 * 获取微信小程序 openid
 * @param {String} code - 微信小程序端通过 wx.login 获取的 code
 * @returns {Promise} 包含 openid 和 session_key 的 Promise
 */
const getWxOpenId = async (code) => {
  try {
    // 从环境变量获取微信小程序的 appid 和 secret
    const appid = process.env.WX_APPID;
    const secret = process.env.WX_SECRET;
    
    if (!appid || !secret) {
      throw new Error('缺少微信小程序配置（APPID 和 SECRET）');
    }
    
    const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=authorization_code`;
    
    const response = await axios.get(url);
    const data = response.data;
    
    if (data.errcode) {
      throw new Error(`微信API错误: ${data.errmsg} (${data.errcode})`);
    }
    
    return {
      openid: data.openid,
      session_key: data.session_key,
      unionid: data.unionid // 如果开发者账号下存在多个移动应用、网站应用和公众号，并且已经在微信开放平台下完成账号关联，则会返回 unionid
    };
  } catch (error) {
    console.error('获取微信OpenID失败:', error);
    throw error;
  }
};

/**
 * 解密微信用户加密数据
 * 注：本函数在微信服务端解密，实际项目中才需要用到，本项目暂时不需要
 * @param {String} sessionKey - 会话密钥
 * @param {String} encryptedData - 包括敏感数据在内的完整用户信息的加密数据
 * @param {String} iv - 加密算法的初始向量
 * @returns {Object} 解密后的用户数据
 */
const decryptUserInfo = (sessionKey, encryptedData, iv) => {
  // 实际开发中，需要使用 crypto 库进行解密
  // 此处省略解密逻辑，因为在实际开发中，这通常在服务端进行
  // 返回示例数据
  return {
    openId: 'OPENID',
    nickName: '微信用户',
    gender: 1,
    city: '广州',
    province: '广东',
    country: '中国',
    avatarUrl: 'https://example.com/avatar.jpg',
    // 其他字段...
  };
};

module.exports = {
  getWxOpenId,
  decryptUserInfo
}; 